package com;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

/**
 * 获取 Integer 的所有成员变量
 * 
 * 修饰符 数据类型 变量名
 * 
 * @author yingfing
 * @date 2020年10月2日 @time 下午7:55:09
 */
public class Reflect_03 {
	public static void main(String[] args) throws Exception {
//		test1();
		test2();
//		test3();
	}

	/**
	 * 获取所有变量
	 * 
	 * @throws ClassNotFoundException
	 */
	public static void test1() throws ClassNotFoundException {

		// 1 获取运行时类
		Class c = Class.forName("java.lang.Integer");

		// 获取所有公共变量
		Field[] fs = c.getFields();
		// 所有的变量,包括私有
		fs = c.getDeclaredFields();

		// 获取每一个变量
		for (Field field : fs) {
			// 修饰符
			// getModifiers 获取修饰符 返回 int 值
			int i = field.getModifiers();

			// 把 int 值转换为对应的修饰符列表
			String strModifier = Modifier.toString(i);
			System.out.print(strModifier + " ");

			// 数据类型
			Class type = field.getType();
			// getName : 获取类全名 比如 java.lang.String
//			System.out.println(type.getName());
			// 简称 比如 String
			System.out.print(type.getSimpleName() + " ");

			// 变量名
			System.out.println(field.getName());

		}

	}

	/**
	 * 获取指定变量
	 * 
	 * @throws Exception
	 */
	public static void test2() throws Exception {

		Class c = Class.forName("java.lang.Integer");
		// 获取指定变量
		Field f = c.getDeclaredField("value");
		System.out.println(f);
		System.out.print(Modifier.toString(f.getModifiers()) + " ");
		System.out.print(f.getType().getSimpleName() + " ");
		System.out.println(f.getName());
	}

	public static void test3() throws Exception {

		User user = new User();
		user.age = 18;
		// 私有化 不能访问
//		user.id=1;
		System.out.println(user);

		Class c = Class.forName("com.User");
		User o = (User) c.newInstance();
		Field f = c.getDeclaredField("id");
		// 打破封装性,否则不能操作私有化变量,设置为 true 之后,在访问的时候就不会再检查访问权限
		f.setAccessible(true);
		// 变量对象 .set (变量所在对象,值)
		f.set(o, 2);

		c.getDeclaredField("age").set(o, 18);
		System.out.println(o);
		// 获取变量的值
		System.out.println(f.get(user));
		System.out.println(user);

//				User [id=0, age=18]
//				User [id=2, age=18]
//				0
//				User [id=0, age=18]

	}
}

class User {
	private int id;
	public int age;

	@Override
	public String toString() {
		return "User [id=" + id + ", age=" + age + "]";
	}

}